//
// Created by zhouyi on 2019/10/24.
//
///////////////////////////////////////////////////////////////////////////
// 编写一个函数，其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
//
// 不要给另外的数组分配额外的空间，你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
//
// 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符
///////////////////////////////////////////////////////////////////////////


#include <string.h>
#include <stdio.h>

// 自己写的
//void reverseString(char *s, int sSize) {
//    printf("reverse before %s string size %d   \n", s, sSize);
//
//    if (s == NULL || sSize == 0) {
//        return;
//    }
//    char tmpChar;
//    for (int i = 0; i < (sSize / 2); ++i) {
//        tmpChar = s[i];
//        s[i] = s[sSize - 1 - i];
//        s[sSize - 1 - i] = tmpChar;
//    }
//
//    printf("reverse after %s string size %d \n", s, sSize);
//
//}

// 范例
void reverseString(char *s, int sSize) {
    if (s == NULL) return;
    if (sSize <= 1) return;

    int i = 0;
    int j = sSize - 1;
    //char *pStart;
    //char *pEnd;
    char temp;

    printf("reverse before %s string size %d   \n", s, sSize);

    for (; (i < sSize) && (j >= 0) && (j > i);) {
        //算法：双指针，一头一尾进行交换，同时向中央移动直到相遇为止。
        //此时时间复杂度为o(n/2).
        //pStart = s + i++; //start
        //pEnd = s + j--;   //end

        //swap
        //temp = *pStart;
        //*pStart = *pEnd;
        //*pEnd = temp;

        temp = s[i];
        s[i] = s[j];
        s[j] = temp;

        i++;
        j--;
    }

    printf("reverse after %s string size %d \n", s, sSize);
}


int main() {
    char string[] = "123456789";
    reverseString(string, (int) strlen(string));

    return 0;
}

